package com.cskaoyan._07initialization._04super;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/9 15:14
 **/
/*
super关键字
    1.表示一个(近似)的引用,指向是子类对象中的父类的成员区域,(近似)看做指向父类对象
    2.super(实参) 表示调用的是父类某个构造方法
    3.在父类和子类中出现了同名的成员,使用super进行区分

this VS super
1.含义:
    this--->引用,指向的是当前的对象
    super-->近似引用,指向的是子类对象中的父类成员区域,近似看做指向父类的对象
2.使用:
    this(实参)--->调用子类自身的构造
    super(实参)-->调用的是父类的构造器
3.区分作用:
    this---->区分同名成员变量跟局部变量
    super--->区分同名的父子类中的成员变量
4:是否受权限控制
    this---->不受访问权限控制
    super--->受父类的权限控制

注意:
 this和super在构造器的第一行
 ---> this和super在一个构造方法里面不能同时出现

 */
public class Demo {
    public static void main(String[] args) {
    }
}

class Father{
    int a = 1;
    private String name = "zs";
    public void test() {
        System.out.println("father test");
    }
}

class Son extends Father{
    int a = 2;

    public void sonMethod() {
        // 访问这个a成员
        // 直接通过成员变量名字访问---->子类自己的成员
        System.out.println(a);

        // 想要访问父类中的同名的成员
        System.out.println(super.a);

        // 访问父类中的private的成员
        // 不可以通过super访问,受权限控制
        // 'name' has private access in 'com.cskaoyan._07initialization._04super.Father'
        // System.out.println(super.name);

        // 通过方法名去调用方法
        // 子类的同名方法
        test();
        // 通过super.去调用父类方法
        super.test();


        // super不是引用
        // 不可以直接打印
        // System.out.println(super);
    }
    public void test() {
        System.out.println("son test");
    }

    public Son(int a) {
        this.a = a;
    }

    public Son() {
        // this要放在代码的第一行
        // System.out.println("1111");
        //super();
        //this(10);
        // Call to 'super()' must be first statement in constructor body

    }
}